Skip to content
c++
class Solution {
    std::string expend(const std::string& s) {
        std::string res = "@#";
        for (int i = 0; i < s.size(); i++) res += s[i], res += '#';
        res += '%';
        return res;
    }
    std::vector<int> Manacher(const std::string &s){
        auto t=expend(s);
        std::vector<int>p(t.size());
        for(int i=1,r=0,c=0;i<t.size()-1;i++){
            p[i]=(r>i?std::min(p[2*c-i],r-i):1);
            while(t[i-p[i]]==t[i+p[i]])p[i]++;
            if(i+p[i]>r){
                r=i+p[i],c=i;
            }
        }
        return p;
    }

public:
    string shortestPalindrome(string s) {
        auto p=Manacher(s);
        //start=(i-p[i])/2
        auto get_start=[&](int idx)->int{
            return (idx-p[idx])/2;
        };

        int idx=0,len=0;;
        for(int i=1;i<p.size()-1;i++){
            if(get_start(i)==0)idx=i,len=p[i]-1;
        }
        auto sub=s.substr(len);
        std::reverse(sub.begin(),sub.end());
        return sub+s;
    }
};